Python kullanarak sıfırdan güvenli bir kripto para cüzdanı oluşturmayı öğrenin. Bu detaylı rehber, temel kavramları, kriptografiyi, kütüphaneleri ve pratik kod örneklerini global bir kitle için kapsar.
Python ile Kripto Para Cüzdanı Oluşturma: Kapsamlı Bir Rehber
Hızla gelişen dijital finans dünyasında, kripto paralar dönüştürücü bir güç olarak ortaya çıktı. Bu devrimin kalbinde, blockchain ağlarıyla etkileşim kurmanız için kişisel geçidiniz olan cüzdan kavramı yatmaktadır. Birçok ticari cüzdan mevcut olsa da, arka planda nasıl çalıştıklarını anlamak, herhangi bir geliştirici veya teknoloji meraklısı için paha biçilmez bir beceridir. Bu rehber, Python kullanarak sıfırdan işlevsel bir kripto para cüzdanı oluşturma sürecini size adım adım göstererek bu süreci anlaşılır hale getirecektir.
Temel kriptografik prensipleri, gerekli Python kütüphanelerini ve anahtar oluşturma, hem Bitcoin hem de Ethereum için adres oluşturma ve işlemleri imzalama için adım adım uygulamayı ele alacağız. Bu makalenin sonunda, cüzdan mekaniği hakkında sağlam bir anlayışa ve kendi çalışan komut satırı cüzdanınıza sahip olacaksınız.
Yasal Uyarı: Bu rehberde sunulan kod ve kavramlar yalnızca eğitim amaçlıdır. Üretim düzeyinde bir cüzdan oluşturmak, titiz güvenlik denetimleri, kapsamlı testler ve gelişmiş güvenlik önlemleri gerektirir. Burada oluşturulan cüzdanı gerçek fonları depolamak için kullanmayın.
Bir Kripto Para Cüzdanının Temel Kavramlarını Anlamak
Tek bir kod satırı yazmadan önce, bir kripto para cüzdanının gerçekten ne olduğunu kavramak çok önemlidir. Adının aksine, bir cüzdan paralarınızı "saklamaz". Kripto paranız, dağıtılmış bir defter olan blockchain üzerinde kayıtlar halinde bulunur. Cüzdan, bu defterdeki varlıklarınız üzerinde size sahiplik ve kontrol sağlayan kriptografik anahtarları yöneten bir yazılım parçasıdır.
Herhangi bir gözetimsiz cüzdanın ana bileşenleri şunlardır:
1. Özel Anahtarlar: Dijital Sırrınız
Özel anahtar, cüzdanınızdaki en kritik bilgi parçasıdır. Çok büyük, rastgele oluşturulmuş bir sayıdır ve gizli tutulur, sadece sizin tarafınızdan bilinir. Amacı, bir işlemi yetkilendirdiğinize dair inkar edilemez bir kanıt görevi gören dijital bir imza oluşturmaktır. Özel anahtarınızı kaybederseniz, fonlarınıza erişiminizi sonsuza dek kaybedersiniz. Başka biri ona erişirse, fonlarınız üzerinde tam kontrole sahip olurlar.
- Benzetme: Özel anahtarı dijital kasanızın ana anahtarı olarak düşünün. Kasayı açabilir ve içeriğinin hareketini yetkilendirebilir.
2. Açık Anahtarlar: Paylaşılabilir Kimliğiniz
Açık anahtar, Eliptik Eğri Kriptografisi (ECC) olarak bilinen tek yönlü bir kriptografik fonksiyon kullanılarak özel anahtarınızdan matematiksel olarak türetilir. Özel anahtardan açık anahtar oluşturmak mümkünken, tersini yapmak hesaplama açısından imkansızdır. Bu tek yönlü ilişki, kripto para güvenliğinin temelini oluşturur.
- Benzetme: Açık anahtar, banka hesap numaranız gibidir. Başkalarıyla paylaşarak size para göndermelerini sağlayabilirsiniz, ancak bu onlara para çekme yeteneği vermez.
3. Adresler: Açık Hedefiniz
Cüzdan adresi, açık anahtarınızın daha kısa, daha kullanıcı dostu bir temsilidir. Açık anahtara ek karma algoritmaları (SHA-256 ve RIPEMD-160 gibi) uygulayarak oluşturulur ve fon gönderirken yazım hatalarını önlemek için genellikle bir sağlama toplamı içerir. Bu, kripto para almak için başkalarıyla paylaştığınız karakter dizesidir.
- Benzetme: Açık anahtarınız hesap numaranız ise, adres hata kontrol özellikleri içeren belirli, biçimlendirilmiş bir fatura numarası gibidir.
4. Kriptografik Bağlantı: Tek Yönlü Bir Yol
Bu bileşenler arasındaki ilişki, katı, tek yönlü bir hiyerarşidir:
Özel Anahtar → Açık Anahtar → Adres
Bu tasarım, adresinizi açık anahtarınızı doğrudan ifşa etmeden (bazı durumlarda) ve kesinlikle özel anahtarınızı asla açığa çıkarmadan güvenle paylaşabilmenizi sağlar.
5. Dijital İmzalar: Sahiplik Kanıtı
Kripto para göndermek istediğinizde, bir işlem mesajı oluşturursunuz (örneğin, "A Adresinden B Adresine 0.5 BTC gönder"). Cüzdan yazılımınız daha sonra özel anahtarınızı kullanarak bu özel işlem için benzersiz bir dijital imza oluşturur. Bu imza, işlemle birlikte ağa yayınlanır. Ağdaki madenciler ve düğümler, özel anahtarınızı görmeden, imzanın geçerli olduğunu doğrulamak için açık anahtarınızı kullanabilir ve işlemin fonların meşru sahibi tarafından yetkilendirildiğini onaylayabilir.
Python Geliştirme Ortamınızı Kurma
Cüzdanımızı oluşturmak için, ilgili karmaşık kriptografiyi halleden birkaç özel Python kütüphanesine ihtiyacımız olacak. Python 3.6 veya daha yenisinin kurulu olduğundan emin olun. Gerekli paketleri pip kullanarak yükleyebilirsiniz:
pip install ecdsa pysha3 base58
Her kütüphanenin ne işe yaradığını inceleyelim:
- ecdsa: Bu, Eliptik Eğri Dijital İmza Algoritması (ECDSA) uygulamak için çok önemli bir kütüphanedir. Bitcoin, Ethereum ve diğer birçok kripto parada kullanılan standart olan
SECP256k1eğrisine dayalı özel ve açık anahtarlar oluşturmak için kullanacağız. Ayrıca dijital imzaların oluşturulmasını ve doğrulanmasını da yönetir. - pysha3: Python'ın yerleşik
hashlibkütüphanesi birçok karma algoritmasını desteklese de, Ethereum adresleri oluşturmak için gereken Keccak-256'yı içermez. Bu kütüphane bu işlevselliği sağlar. - base58: Bu kütüphane, insan tarafından okunabilir Bitcoin adresleri oluşturmak için kullanılan bir format olan Base58Check kodlamasını uygular. Yazım hatalarından kaynaklanan hataları önlemeye yardımcı olmak için bir sağlama toplamı içerir.
- hashlib: Bu yerleşik Python kütüphanesi, Bitcoin adresi oluşturmada temel adımlar olan SHA-256 ve RIPEMD-160 karma işlemleri için kullanılacaktır.
Adım Adım Uygulama: Cüzdan Mantığını Oluşturma
Şimdi koda dalalım. Cüzdanımızın temel işlevlerini parça parça oluşturacak ve her adımı yol boyunca açıklayacağız.
Adım 1: Özel Anahtar Oluşturma
Özel anahtar, esasen 256 bitlik (32 baytlık) bir sayıdır. En önemli gereksinim, gerçek rastgelelikle oluşturulmasıdır. Zayıf bir rastgele sayı üreteci kullanmak, bir saldırganın tahmin edebileceği öngörülebilir anahtarlara yol açabilir.
Python'ın yerleşik secrets modülü, kriptografik olarak güvenli rastgele sayılar oluşturmak için tasarlanmıştır ve ihtiyaçlarımız için mükemmeldir.
Burada, `os.urandom(32)`, 256 bitlik bir özel anahtar için tam olarak ihtiyacımız olan 32 kriptografik olarak güvenli rastgele baytı sağlar.
Adım 2: Açık Anahtarı Türetme
Ardından, `SECP256k1` eliptik eğrisini kullanarak özel anahtardan açık anahtarı türetiriz. `ecdsa` kütüphanesi bu süreci basitleştirir.
```python def private_key_to_public_key(private_key_bytes): """Convert a private key to its corresponding public key.""" # SECP256k1 is the curve used by Bitcoin and Ethereum sk = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1) # Get the public key in uncompressed format (starts with 0x04) vk = sk.verifying_key public_key_bytes = vk.to_string("uncompressed") return public_key_bytes ````ecdsa.SigningKey` nesnesi özel anahtarımızı temsil eder. Daha sonra karşılık gelen `verifying_key` (açık anahtar) alır ve onu "sıkıştırılmamış" bir biçimde dışa aktarırız. Sıkıştırılmamış bir açık anahtar 65 bayt uzunluğundadır: `0x04` öneki, ardından eliptik eğri üzerindeki bir noktanın 32 baytlık X koordinatı ve 32 baytlık Y koordinatı gelir.
Adım 3: Bitcoin Adresi Oluşturma
Bir açık anahtardan Bitcoin adresi oluşturmak, güvenlik ve hata kontrolü için tasarlanmış çok adımlı bir süreçtir. İşte standart P2PKH (Pay-to-Public-Key-Hash) adres oluşturma akışı:
- SHA-256 karma: Açık anahtarı SHA-256 kullanarak karma haline getirin.
- RIPEMD-160 karma: Önceki adımın sonucunu RIPEMD-160 kullanarak karma haline getirin.
- Sürüm baytı ekleyin: RIPEMD-160 karma değerine bir sürüm baytı öneki ekleyin. Bitcoin ana ağı için bu `0x00`'dır.
- Sağlama toplamı hesaplaması: Genişletilmiş karma üzerinde iki kez SHA-256 karma işlemi uygulayın ve son karmanın ilk 4 baytını alın. Bu sağlama toplamıdır.
- Sağlama toplamını ekleyin: 4 baytlık sağlama toplamını sürüm önekli karmanın sonuna ekleyin.
- Base58Check kodlama: Tüm bayt dizisini Base58Check kullanarak kodlayarak son, insan tarafından okunabilir adresi elde edin.
Şimdi bunu Python'da uygulayalım:
```python def public_key_to_btc_address(public_key_bytes): """Convert a public key to a Bitcoin P2PKH address.""" # Step 1 & 2: SHA-256 then RIPEMD-160 sha256_hash = hashlib.sha256(public_key_bytes).digest() ripemd160_hash = hashlib.new('ripemd160') ripemd160_hash.update(sha256_hash) hashed_public_key = ripemd160_hash.digest() # Step 3: Add version byte (0x00 for Mainnet) version_byte = b'\x00' versioned_hash = version_byte + hashed_public_key # Step 4 & 5: Create checksum and append # Double SHA-256 hash checksum_hash_1 = hashlib.sha256(versioned_hash).digest() checksum_hash_2 = hashlib.sha256(checksum_hash_1).digest() checksum = checksum_hash_2[:4] binary_address = versioned_hash + checksum # Step 6: Base58Check encode btc_address = base58.b58encode(binary_address).decode('utf-8') return btc_address ```Adım 4: Ethereum Adresi Oluşturma
Ethereum adresi oluşturmak, Bitcoin'e kıyasla daha basittir. Açık anahtarın Keccak-256 karma değerini almayı ve sonucun son 20 baytını kullanmayı içerir.
- Keccak-256 karma: Açık anahtarın Keccak-256 karma değerini alın. Açık anahtarı *olmadan* `0x04` öneki kullanmamız gerektiğini unutmayın.
- Son 20 baytı alın: Ethereum adresi, bu karmanın son 20 baytıdır (40 onaltılık karakter).
- Format: Adresin başına `0x` eklemek standarttır.
Bunu `pysha3` kullanarak uygulayalım:
```python def public_key_to_eth_address(public_key_bytes): """Convert a public key to an Ethereum address.""" # Ethereum address generation uses the uncompressed public key without the 0x04 prefix uncompressed_pk = public_key_bytes[1:] # Step 1: Keccak-256 hash keccak_hash = keccak_256(uncompressed_pk).digest() # Step 2: Take the last 20 bytes eth_address_bytes = keccak_hash[-20:] # Step 3: Format with '0x' prefix eth_address = '0x' + eth_address_bytes.hex() return eth_address ```Adım 5: Bir Mesajı İmzalama
Dijital bir imza, bir özel anahtar sahibinin bir mesajı (bir işlem gibi) yetkilendirdiğini kanıtlar. Süreç, verimlilik ve güvenlik için mesajın kendisini değil, mesajın karma değerini imzalamayı içerir.
```python def sign_message(private_key_bytes, message): """Sign a message with the given private key.""" # It's standard practice to sign the hash of the message message_hash = hashlib.sha256(message.encode('utf-8')).digest() sk = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1) signature = sk.sign(message_hash) return signature ```Adım 6: Bir İmzayı Doğrulama
Doğrulama tersine bir süreçtir. Açık anahtar, orijinal mesaj ve imzaya sahip herkes, imzanın gerçek olduğunu doğrulayabilir. Blockchain ağı işlemleri bu şekilde doğrular.
```python def verify_signature(public_key_bytes, signature, message): """Verify a signature for a message with the given public key.""" message_hash = hashlib.sha256(message.encode('utf-8')).digest() vk = ecdsa.VerifyingKey.from_string(public_key_bytes, curve=ecdsa.SECP256k1, hashfunc=hashlib.sha256) try: # The verify method will return True if valid, or raise an exception return vk.verify(signature, message_hash) except ecdsa.BadSignatureError: return False ```Cüzdanı Birleştirme: Basit Bir Komut Satırı Arayüzü (CLI)
Artık tüm temel işlevlere sahip olduğumuza göre, bunları basit, kullanılabilir bir komut satırı aracında birleştirelim. Mantığı kapsüllemek için bir `Wallet` sınıfı oluşturacak ve kullanıcı komutlarını işlemek için Python'ın `argparse` modülünü kullanacağız.
İşte tüm işlevlerimizi bir bütüncül uygulamaya entegre eden eksiksiz bir betik.
```python #!/usr/bin/env python3 import os import hashlib import base58 import ecdsa import argparse from sha3 import keccak_256 class Wallet: """Represents a cryptocurrency wallet with key management and address generation.""" def __init__(self, private_key_hex=None): if private_key_hex: self.private_key = bytes.fromhex(private_key_hex) else: self.private_key = self._generate_private_key() self.public_key = self._private_to_public_key(self.private_key) self.btc_address = self._public_to_btc_address(self.public_key) self.eth_address = self._public_to_eth_address(self.public_key) def _generate_private_key(self): return os.urandom(32) def _private_to_public_key(self, private_key): sk = ecdsa.SigningKey.from_string(private_key, curve=ecdsa.SECP256k1) return sk.verifying_key.to_string("uncompressed") def _public_to_btc_address(self, public_key): sha256_hash = hashlib.sha256(public_key).digest() ripemd160 = hashlib.new('ripemd160') ripemd160.update(sha256_hash) hashed_pk = ripemd160.digest() versioned_hash = b'\x00' + hashed_pk checksum = hashlib.sha256(hashlib.sha256(versioned_hash).digest()).digest()[:4] binary_address = versioned_hash + checksum return base58.b58encode(binary_address).decode('utf-8') def _public_to_eth_address(self, public_key): uncompressed_pk = public_key[1:] keccak_hash = keccak_256(uncompressed_pk).digest() return '0x' + keccak_hash[-20:].hex() def display_details(self): print(f"Özel Anahtar (hex): {self.private_key.hex()}") print(f"Açık Anahtar (hex): {self.public_key.hex()}") print(f"Bitcoin Adresi: {self.btc_address}") print(f"Ethereum Adresi: {self.eth_address}") def main(): parser = argparse.ArgumentParser(description="Basit bir komut satırı kripto para cüzdanı.") parser.add_argument("command", choices=["create", "details"], help="Çalıştırılacak komut.") parser.add_argument("--privatekey", help="Ayrıntılarını almak için onaltılık biçimde mevcut bir özel anahtar.") args = parser.parse_args() if args.command == "create": wallet = Wallet() print("--- Yeni Cüzdan Oluşturuldu ---") wallet.display_details() print("\n*** ÖNEMLİ ***") print("Özel anahtarınızı güvenli bir yere kaydedin. Fonlarınıza erişmenin tek yolu budur.") elif args.command == "details": if not args.privatekey: print("Hata: 'details' komutu, --privatekey bayrağını kullanarak bir özel anahtar gerektirir.") return try: wallet = Wallet(private_key_hex=args.privatekey) print("--- Cüzdan Ayrıntıları ---") wallet.display_details() except Exception as e: print(f"Özel anahtardan cüzdan yüklenirken hata: {e}") if __name__ == "__main__": main() ```Bu CLI aracını nasıl kullanırsınız:
- Yukarıdaki kodu bir Python dosyası olarak kaydedin (örneğin, `cli_wallet.py`).
- Terminalinizi veya komut isteminizi açın.
- Yeni bir cüzdan oluşturmak için: `python cli_wallet.py create`
- Mevcut bir özel anahtardan ayrıntıları görüntülemek için: `python cli_wallet.py details --privatekey YOUR_PRIVATE_KEY_IN_HEX`
Güvenlik En İyi Uygulamaları ve Önemli Hususlar
Temel bir cüzdanı başarıyla oluşturduk, ancak üretime hazır bir uygulama güvenliğe çok daha derin bir odaklanma gerektirir. İşte dikkate almanız gereken bazı kritik noktalar.
1. Özel Anahtarları Asla Düz Metin Olarak Saklamayın
Betikimiz özel anahtarı konsola yazdırır, bu oldukça güvensizdir. Gerçek bir uygulamada, özel anahtarlar beklemedeyken güçlü bir parola kullanılarak şifrelenmelidir. Sadece imzalama için gerektiğinde bellekte şifresi çözülmelidir. Profesyonel çözümler genellikle anahtarları korumak için donanım güvenlik modülleri (HSM'ler) veya cihazlardaki güvenli bölgeler kullanır.
2. Entropinin Önemi
Cüzdanınızın güvenliği, özel anahtarı oluşturmak için kullanılan rastgelelikle (entropi) başlar. `os.urandom` çoğu modern işletim sisteminde iyi bir kaynak olsa da, yüksek değerli uygulamalar için geliştiriciler öngörülemezliği sağlamak amacıyla genellikle birden fazla kaynaktan entropi toplarlar.
3. Mnemonik İfadeler (Tohum İfadeleri) - Sektör Standardı
Uzun onaltılık özel anahtarları manuel olarak yedeklemek hantal ve hataya açıktır. Sektör bunu Hiyerarşik Deterministik (HD) cüzdanlar (BIP-32'de tanımlanmıştır) ve Mnemonik İfadeler (BIP-39) ile çözdü. Mnemonik ifade, ana özel anahtarınızı ve sonraki tüm anahtarları deterministik olarak yeniden oluşturmak için kullanılabilecek 12-24 yaygın kelimeden oluşan bir dizidir. Bu, cüzdan yedeklemeyi ve kurtarmayı çok daha kullanıcı dostu hale getirir.
4. Bu Bir Eğitim Aracıdır, Üretim Cüzdanı Değil
Bu uygulamanın basitleştirilmiş bir model olduğunu tekrarlamak hayati önem taşır. Gerçek dünyada bir cüzdanın birden fazla adresi yönetmesi, bakiyeleri almak ve işlemleri oluşturmak için blockchain düğümleriyle etkileşim kurması, ücretleri hesaplaması ve imzalanan işlemleri ağa yayınlaması gerekir. Ayrıca güvenli bir kullanıcı arayüzüne ve sağlam hata yönetimine de ihtiyacı vardır.
5. Ağ Etkileşimi
Cüzdanımız anahtarlar oluşturabilir ve mesajları imzalayabilir, ancak bir blockchain ağıyla iletişim kuramaz. Tam teşekküllü bir uygulama oluşturmak için, RPC (Uzak Prosedür Çağrısı) aracılığıyla blockchain düğümlerine bağlanabilen kütüphaneleri entegre etmeniz gerekir. Ethereum için `web3.py` standart kütüphanedir. Bitcoin için `python-bitcoinlib` gibi kütüphaneler kullanılabilir.
Sonuç ve Sonraki Adımlar
Tebrikler! Python kullanarak bir kripto para cüzdanının kriptografik çekirdeğini başarıyla oluşturdunuz. Açık/özel anahtar kriptografisinin temel teorisinden, hem Bitcoin hem de Ethereum ağları için geçerli adresler oluşturan pratik bir uygulamaya kadar bir yolculuk yaptık.
Bu proje, blockchain teknolojisinin daha derinlemesine keşfi için güçlü bir temel sağlar. Bir cüzdanın, özünde, kanıtlanmış kriptografik prensipler üzerine inşa edilmiş sofistike bir anahtar yönetim sistemi olduğunu ilk elden gördünüz.
Buradan nereye gidersiniz? Sonraki adımlarınız olarak bu zorlukları göz önünde bulundurun:
- HD Cüzdanları Uygulayın: Tek bir mnemonik tohum ifadesinden milyonlarca adresi yönetebilen bir cüzdan oluşturmak için BIP-32, BIP-39 ve BIP-44 standartlarını keşfedin.
- Ağa Bağlanın: Bir Ethereum düğümüne (Infura veya Alchemy gibi) bağlanmak, bir adres bakiyesini kontrol etmek ve ham bir işlem oluşturmak için `web3.py` kullanın.
- Kullanıcı Arayüzü Oluşturun: Cüzdanınızı daha kullanıcı dostu hale getirmek için Tkinter gibi bir çerçeve kullanarak basit bir grafiksel kullanıcı arayüzü (GUI) veya Flask/Django kullanarak bir web arayüzü oluşturun.
- Diğer Blockchain'leri Keşfedin: Diğer blockchain platformlarının adreslerini nasıl oluşturduğunu araştırın ve kodunuzu onları destekleyecek şekilde uyarlayın.
Blockchain dünyası, açık kaynak işbirliği ve bilgiye olan susuzluk üzerine kurulmuştur. Bunun gibi araçlar inşa ederek, sadece kod yazmayı öğrenmekle kalmazsınız – yeni bir dijital ekonominin dilini öğrenirsiniz. Denemeye devam edin, inşa etmeye devam edin ve merkezi olmayan teknolojinin engin potansiyelini keşfetmeyi sürdürün.